package refactortips.editors.codeSmells;

import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.wb.swt.SWTResourceManager;

import refactortips.editors.AbstractRefactorTipsEditor;
import refactortips.editors.CommandMouseAdapter;

public class DivergentChangeEditor extends AbstractRefactorTipsEditor {

	protected final FormToolkit formToolkit = new FormToolkit(Display.getDefault());
	
	public DivergentChangeEditor() {
	}

	/**
	 * Create contents of the editor part.
	 * @param parent
	 */
	@Override
	public void createPartControl(Composite parent) {
		
		Form frmCodeSmell = formToolkit.createForm(parent);
		formToolkit.paintBordersFor(frmCodeSmell);
		frmCodeSmell.setText("Divergent Change");
		frmCodeSmell.getBody().setLayout(new FillLayout(SWT.HORIZONTAL));
		
		TabFolder tabFolder = new TabFolder(frmCodeSmell.getBody(), SWT.NONE);
		formToolkit.adapt(tabFolder);
		formToolkit.paintBordersFor(tabFolder);
		
		ScrolledComposite sc = new ScrolledComposite(tabFolder, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
		sc.setExpandHorizontal(true);
	    sc.setExpandVertical(true);
		
		TabItem tbtmDescription = new TabItem(tabFolder, SWT.NONE);
		tbtmDescription.setText("Descri\u00E7\u00E3o");
		
		ScrolledComposite scrolledComposite = new ScrolledComposite(tabFolder, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		tbtmDescription.setControl(scrolledComposite);
		formToolkit.paintBordersFor(scrolledComposite);
		scrolledComposite.setExpandHorizontal(true);
		scrolledComposite.setExpandVertical(true);
		
		Composite composite_3 = new Composite(scrolledComposite, SWT.NONE);
		formToolkit.adapt(composite_3);
		formToolkit.paintBordersFor(composite_3);
		composite_3.setLayout(null);
		
		Label lblDescription = new Label(composite_3, SWT.NONE);
		lblDescription.setBounds(10, 10, 102, 25);
		lblDescription.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
		lblDescription.setFont(SWTResourceManager.getFont("Segoe UI", 14, SWT.BOLD));
		formToolkit.adapt(lblDescription, true, true);
		lblDescription.setText("Descri\u00E7\u00E3o");
		
		Link linkExtractClass = new Link(composite_3, SWT.NONE);
		linkExtractClass.setBounds(284, 335, 86, 21);
		linkExtractClass.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		linkExtractClass.addMouseListener(new CommandMouseAdapter(getSite(), "RefactorTips.commands.extractClassCommand"));
		formToolkit.adapt(linkExtractClass, true, true);
		linkExtractClass.setText("<a>Extract Class</a>");
		
		StyledText styledText = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText.setEnabled(false);
		styledText.setDoubleClickEnabled(false);
		styledText.setJustify(true);
		styledText.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText.setText("\t\tN\u00F3s estruturamos o nosso software para fazer com que altera\u00E7\u00F5es sejam simples de serem feitas. At\u00E9 porque software deve ser flex\u00EDvel. Quando fazemos uma altera\u00E7\u00E3o n\u00F3s queremos ser capazes de pular para um \u00FAnico ponto claro no sistema e realizar a altera\u00E7\u00E3o. Quando voc\u00EA n\u00E3o pode fazer isso, voc\u00EA cheirando uma ou duas pung\u00EAncias intimamente relacionadas.");
		styledText.setBounds(63, 64, 758, 106);
		formToolkit.adapt(styledText);
		formToolkit.paintBordersFor(styledText);
		
		StyledText styledText_1 = new StyledText(composite_3, SWT.READ_ONLY | SWT.WRAP);
		styledText_1.setText("\t\tAltera\u00E7\u00E3o divergente (Divergent Change) ocorre quando uma classe \u00E9 comumente alterada de diferentes formas por diferentes motivos. Se olhar para uma classe e disser, \u201CBom, eu vou ter que alterar esse tr\u00EAs m\u00E9todos toda vez que eu obter um novo banco de dados; eu tenho que alterar esses quatro m\u00E9todos toda vez que surge um novo instrumento financeiro\u201D, voc\u00EA provavelmente tem uma situa\u00E7\u00E3o no qual dois objetos s\u00E3o melhores do que um. Dessa forma cada objeto \u00E9 alterado apenas como resultado de um tipo de altera\u00E7\u00E3o. Claro, voc\u00EA frequentemente descobre isso apenas depois de ter adicionado alguns bancos de dados ou instrumentos financeiros. Qualquer altera\u00E7\u00E3o para lidar com uma varia\u00E7\u00E3o deve alterar uma \u00FAnica classe, e tudo o que for escrito nessa nova classe deve expressar a varia\u00E7\u00E3o. Para limpar isso, voc\u00EA identificar tudo que muda por algum motivo e usa\t\t\t\t\t\t\tpara coloca-las todas juntas.");
		styledText_1.setFont(SWTResourceManager.getFont("Segoe UI", 12, SWT.NORMAL));
		styledText_1.setEnabled(false);
		styledText_1.setJustify(true);
		styledText_1.setDoubleClickEnabled(false);
		styledText_1.setBounds(63, 167, 758, 244);
		formToolkit.adapt(styledText_1);
		formToolkit.paintBordersFor(styledText_1);
		scrolledComposite.setContent(composite_3);
		scrolledComposite.setMinSize(composite_3.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		TabItem tbtmUsage = new TabItem(tabFolder, SWT.NONE);
		tbtmUsage.setText("Exemplo");
		
		ScrolledComposite scrolledComposite_1 = new ScrolledComposite(tabFolder, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		tbtmUsage.setControl(scrolledComposite_1);
		formToolkit.paintBordersFor(scrolledComposite_1);
		scrolledComposite_1.setExpandHorizontal(true);
		scrolledComposite_1.setExpandVertical(true);
		
		Composite composite = new Composite(scrolledComposite_1, SWT.NONE);
		formToolkit.adapt(composite);
		formToolkit.paintBordersFor(composite);
		scrolledComposite_1.setContent(composite);
		scrolledComposite_1.setMinSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
		
		TabItem tbtmVideo = new TabItem(tabFolder, SWT.NONE);
		tbtmVideo.setText("Video");
		
		Browser browser = new Browser(tabFolder, SWT.NONE);
		browser.setUrl("");
		tbtmVideo.setControl(browser);
		formToolkit.paintBordersFor(browser);
	}
}
